package br.edu.ufcg.unknown;

import java.io.File;

import br.edu.ufcg.unknown.exception.AnalisadorLexicoUnknownRuntimeException;
import br.edu.ufcg.unknown.exception.AnalisadorSintaticoUnknownRuntimeException;
import br.edu.ufcg.unknown.exception.UnknownException;
import br.edu.ufcg.unknown.sintatico.AnalisadorSintatico;

public class MainAnalisadorSintatico {

	public static void main(String[] args) {

		if (args.length != 2) {
			System.err.println("Erro! Use: java " + MainAnalisadorSintatico.class.getName()
					+ " <arquivo do código-fonte> <arquivo de palavras-chaves>");
			System.out.println("Exemplo: java " + MainAnalisadorSintatico.class.getName()
					+ " exemplos/file2.unknown resources/palavras-reservadas.txt");
			System.exit(1);
		}

		File codigoFonte = new File(args[0]);
		File palavrasReservadas = new File(args[1]);

		if (!codigoFonte.exists()) {
			System.err.println("Erro! Arquivo não existe: " + codigoFonte.getName());
			System.exit(1);
		}

		if (!palavrasReservadas.exists()) {
			System.err.println("Erro! Arquivo não existe: " + palavrasReservadas.getName());
			System.exit(1);
		}

		try {
			AnalisadorSintatico as = new AnalisadorSintatico(codigoFonte, palavrasReservadas);
			if(as.validar() && as.getListaDeErros().size() == 0){
				System.out.println("Código-fonte OK");
			} else {
				System.out.println("### ERRO DE COMPILAÇÃO ###");
				System.out.println();
				mostrarErros(as.getErro());
			}
		} catch (AnalisadorLexicoUnknownRuntimeException e) {
			System.err.println("Erro! " + e.getMessage() + ": <" + (e.getCaractere() != null ? e.getCaractere() : e.getToken().getLexema())
					+ "> Linha: " + e.getLinha() + " Coluna: " + e.getColuna());
		} catch (AnalisadorSintaticoUnknownRuntimeException e) {
			mostrarErros(e);
		} catch (UnknownException e) {
			e.printStackTrace();
		}

	}
	
	public static void mostrarErros(AnalisadorSintaticoUnknownRuntimeException e){
		
		System.err.println("Erro! Lexema encontrado: <" + e.getLexemaEncontrado() + "> Linha: " + e.getLinha() + " Coluna: "
				+ e.getColuna());
		System.err.println("Símbolo não-terminal ou terminal esperado: " + e.getSimboloTerminalOuNaoTerminalEsperado());
		System.err.println("Informações adicionais:");
		System.err.println("* Lexema(s) esperado(s): ");
		for (String lexema : e.getLexemasEsperados()) {
			System.err.println("<" + lexema + ">");
		}
		
		String separador = "================================================================================================";
		
		for (AnalisadorSintaticoUnknownRuntimeException erro : e.getListaDeErros()) {
			System.out.println(separador);
			System.err.println("Erro! Lexema encontrado: <" + erro.getLexemaEncontrado() + "> Linha: " + erro.getLinha() + " Coluna: "
					+ erro.getColuna());
			System.err.println("Símbolo não-terminal ou terminal esperado: " + erro.getSimboloTerminalOuNaoTerminalEsperado());
			System.err.println("Informações adicionais:");
			System.err.println("* Lexema(s) esperado(s): ");
			for (String lexema : erro.getLexemasEsperados()) {
				System.err.println("<" + lexema + ">");
			}
		}
		
	}

}
